package com.cskaoyan.basic;

/*
        如果使用但分支的异常处理，所有不同类型的异常，只会catch代码块处理，但是有时候，我们需要针对不同类型的异常有不同
        的处理，此时，我们就需要使用多分支的异常处理了

        如何区分不同异常分支(异常处理器)呢？只需要声明，多个catch代码块，声明每个catch代码块处理不同类型的异常即可

          jvm 怎么知道，把异常对象交给哪个异常分支，并执行那个异常分支中的代码，这就存在一个多分支异常处理的匹配问题：
          1.根据实际的异常对象的类型，和异常分支(异常处理器)声明的异常类型，从上到下一次做类型匹配
          2. 一旦通过类型匹配，发现实际异常对象的类型和Catch分支(异常处理器)声明的异常类型，类型匹配，就把异常对象交给
             这个异常分支（异常处理器）
          3. 多分支的异常处理的执行，有点类似于多分支if-else的执行，一次匹配，只会执行多个catch分支中的一个，如果我们定义了
             处理Exception类型的catch分支，它就类似于所分支if-else 中最后的那个else分支


           注意事项：
          1.如果说，在多catch分支的情况下，如果不同的catch分支，处理的异常类型，有父子关系
            那么就一定要注意，处理子类的异常分支写在前面，父类的异常分支写在后面

          2. 不是包裹在try块中的代码，一旦产生了异常，都是自己来处理，只有try中异常类型，
             没有对应类型的异常处理器的时候

         除零异常，数组越界异常，空指针异常都属于 运行时异常
 */
public class Demo4MultiHandle {

    public static void main(String[] args) {

        try {
            int i = 1;
            int j = 0;
            // 这里会出现除零异常
            //int result = i / j;
            System.out.println("after / by zero");

            int[] array = new int[3];
            // 数组越界异常
            System.out.println(array[3]);
            System.out.println("after ArrayIndexOutOfBounds Exception");


            array = null;
            // 空指针异常
            //System.out.println(array[0]);
            System.out.println("after NullPointer Exception");

            // 如果说在接下来的代码中，还有另外一种类型的异常

        } catch (ArithmeticException e) {
            System.out.println("处理除0异常");
        } catch (NullPointerException e) {
            System.out.println("处理空指针异常");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("处理数组越界异常");
        } catch (Exception e) {
            System.out.println("处理异常");
        }

        System.out.println("after try-catch");
    }
}
